package com.xjh.basestudy.javabase.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class huoquchengyuanfangfa {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class<?> c = Class.forName("heimaliuyi.reflect.Student");
        //method[] getMethods​() 返回一个包含 方法对象的数组， 方法对象反映由该 Class对象表示的类或接口的所有公共方法，包括由类或接口声明的对象以及从超类和超级接口继承的类。
//        Method[] methods = c3p0pool.getMethods();
//        method[] getDeclaredMethods​() 返回一个包含 方法对象的数组， 方法对象反映由 Class对象表示的类或接口的所有声明方法，包括public，protected，default（package）访问和私有方法，但不包括继承方法。
        Method[] methods = c.getDeclaredMethods();//declared公开的
        for(Method method : methods){
            System.out.println(method);
        }
        //获取单个指定方法
        //获取成员方法对象
        Method m = c.getMethod("mothod1");
        //获取无参构造方法创建对象
        Constructor<?> con = c.getConstructor();
        Object obj = con.newInstance();
        //Object invoke​(Object obj, Object... args) 在具有指定参数的指定对象上调用此 方法对象表示的基础方法。
        //object：返回值类型 ，Object调用方法的对象，args：方法需要的参数
        m.invoke(obj);//用method对象的invoke方法调用由指定成员方法生成的obj对象，其实就是调用obj对象的m（也就是method1）方法。

        //一般
//        Student s = new Student();
//        s.mothod1();



    }
}
